/**
 * description：js数据类型处理
 * author：
 * */

export default class Type{
    constructor(){}
    /* 检测数据类型，返回数据类型小写string。如array,[object Object] */
    checkType(value){
        return Object.prototype.toString.call(value).replace(/\[object\s|\]/g,'').toLowerCase();
    }
    isType(type){
        return (value)=>{
            return this.checkType(value).toLowerCase()===type.toLowerCase();
        }
    }
    /* todo 函数科里化 */
    curry(fn){
        if(this.checkType(fn)!=='function'){
            throw new Error('第一个参数必须传入函数');
        }
        return function curriedFunc(...args){
            if(args.length<fn.length){
                return function curried(...arg){
                    return curriedFunc.apply(null,args.concat(arg));
                };
            }else{
                return fn.apply(null,args);
            }
        }
    }
    /* todo 线性转树形结构 */
    /*
     * description:根节点为多个，即多个树集合
     * 步骤一：list转为key(parentId):value[含该parentId的数据集合]。
     * 步骤二：从parentId为null/undefined/''开始，逐渐组成树结构
      * */
    lineConvertToTree(list=[]) {
        let rootArr = [],childListToKeyValue={};
        if (this.isArray(list)) return rootArr;
        // 组装根节点
        for(let i=0;i<list.length;i++){
            if(list[i].parentId===null||list[i].parentId===undefined&&list[i].parentId===''){
                rootArr.push(...list.splice(i,1));
                i--;
            }
        }
        // 将子节点转为key:value对象
        for(let i=0;i<list.length;i++){
            if(!childListToKeyValue[list[i].parentId]){
                childListToKeyValue[list[i].parentId]=[];
            }
            childListToKeyValue[list[i].parentId].push(list[i]);
        }
        // 多个树集合
        for(let i=0;i<rootArr.length;i++){
            // todo 递归：借助一个数组，将相关数据集合在一起、循环，达到递归作用
            let currentChildren=[rootArr[i]];
            // 通过id与parentId对应关系，组成tree结构
            while(currentChildren.length>0){
                let currentNode=currentChildren.shift();
                currentNode.children=childListToKeyValue[currentNode.id]?childListToKeyValue[currentNode.id]:[];
                currentChildren=[...currentChildren,...currentNode.children];
            }
        }
        return rootArr;
    }
    /* todo 树形转线性结构 */
    /*
     * @param:root{}
      * */
    treeCovertToLine(root={}){
        let list=[],queue=[];
        if(this.isObject(root)) return list;
        queue.push(root);
        while(queue.length>0){
            let currentNode=queue.shift();
            if(currentNode.children&&currentNode.children.length>0){
                queue=[...queue,...currentNode.children];
            }
            delete currentNode.children;
            list.push(currentNode);
        }
        return list;
    }
}
